﻿using Encryption.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace Encryption.Utility
{
    class Md5 : CommonUtilityBase
    {
        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate int Md5Encode(byte[] a, ref byte c);
        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate int Md5EncodeToLower(byte[] a, ref byte c);
        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate int Md5Encode16(byte[] a, ref byte c);
        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate int Md5Encode16ToLower(byte[] a, ref byte c);

        private string m_md5Encode;
        private string m_md5Encode16Bit;
        private string m_md5Encode16BitToLower;
        private string m_md5EncodeToLower;

        public Md5()
        {
            m_md5Encode = "MD5Encode";
            m_md5Encode16Bit = "MD5Encode16Bit";
            m_md5Encode16BitToLower = "MD5Encode16BitToLower";
            m_md5EncodeToLower = "MD5EncodeToLower";
        }

        public string MD5Encode(string src)
        {
            if (GetPublicDll() == IntPtr.Zero)
                return "";
            Md5Encode md5Encode = (Md5Encode)GetFunction(m_md5Encode, typeof(Md5Encode));
            byte[] o = new byte[32];
            md5Encode(Encoding.UTF8.GetBytes(src),ref o[0]);
            return Encoding.UTF8.GetString(o);
        }

        public string MD5Encode16Bit(string src)
        {
            if (GetPublicDll() == IntPtr.Zero)
                return "";
            Md5Encode16 md5Encode = (Md5Encode16)GetFunction(m_md5Encode16Bit, typeof(Md5Encode16));
            byte[] o = new byte[32];
            md5Encode(Encoding.UTF8.GetBytes(src), ref o[0]);
            return Encoding.UTF8.GetString(o);
        }

        public string MD5Encode16BitToLower(string src)
        {
            if (GetPublicDll() == IntPtr.Zero)
                return "";
            Md5Encode16ToLower md5Encode = (Md5Encode16ToLower)GetFunction(m_md5Encode16BitToLower, typeof(Md5Encode16ToLower));
            byte[] o = new byte[32];
            md5Encode(Encoding.UTF8.GetBytes(src), ref o[0]);
            return Encoding.UTF8.GetString(o);
        }

        public string MD5EncodeToLower(string src)
        {
            if (GetPublicDll() == IntPtr.Zero)
                return "";
            Md5EncodeToLower md5Encode = (Md5EncodeToLower)GetFunction(m_md5EncodeToLower, typeof(Md5EncodeToLower));
            byte[] o = new byte[32];
            md5Encode(Encoding.UTF8.GetBytes(src), ref o[0]);
            return Encoding.UTF8.GetString(o);
        }
    }
}
